package main

import (
	"gorm.io/driver/mysql"
	_ "gorm.io/driver/mysql"
	"gorm.io/gorm"
)

//1.定义模型
type user struct {
	gorm.Model        //ID CreatedAt UpdateAt ...
	Name       string `gorm:"default:'小王子'"` //gorm为Name指定默认值，在创建行时调用这个默认值
	Age        int64
}

func main() {
	//2.连接mysql数据库
	dsn := "root:123@tcp(127.0.0.1:3306)/db1?charset=utf8&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}
	//3.把模型与数据库中的表对应起来
	err = db.AutoMigrate(&user{})
	if err != nil {
		return 
	}
	//4.创建行
	//u1 := user{Age: 30} //在代码层里面创建一个user对象 ，此处未指定Name的值是因为在模型中已经通过tag标签设定了Name的默认值
	//fmt.Println(db.NewRecord(&u))  //判断主键是否为空
	//db.Create(&u1) //在数据库中创建了一条qm，18的记录
	//4.用指针方式实现零值存入数据库（同时user结构体中必须对Name的类型设置为指针类型）
	//u := user{Name: new(string), Age: 19}
	//db.Create(&u)
	//	4.简单查询
	//4.1 根据主键查询第一条记录
	//var u user //声明模型结构体类型变量u
	////u:=new(user) //声明模型结构体类型变量u 语法糖
	////db.First(u)  //语法糖
	//db.First(&u)
	//fmt.Printf("u:%#v\n", u)
	////4.2 随机查询一条记录
	//db.Take(&u)
	//fmt.Printf("u:%#v\n", u)
	////4.3 根据主键查询最后一条记录
	//db.Last(&u)
	//fmt.Printf("u:%#v\n", u)
	////4.4 查询所有记录
	//db.Find(&u)
	//fmt.Printf("u:%#v\n", u)
	////4.5 查询指定的某条记录（仅当主键为整型时可用）
	//db.First(&u, 2) //相当于select * from users where id =2;
	//fmt.Printf("u:%#v\n", u)
	//	5 更新操作
	// 5.1更新所有字段  save()方法
	//var update1 user
	//update1.Name = "王旭东"
	//update1.Age = 23
	//db.Debug().Save(&update1)
	//// 5.2更新指定字段 可以使用Update（）或者Updates()
	//db.Debug().Model(&update1).Update("name", "王子")                      //Debug是用来打印出相应的sql语句
	//db.Model(&update1).Where("active = ?", true).Update("name", "hello") //根据给定的条件更新单个属性
	// 6删除操作
	// 6.1删除一条记录

}
